#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include <gmssl/sm2.h>  
#include <gmssl/error.h>  

// 辅助函数：保存公钥到文件
int save_public_key_to_file(const char *filename, const SM2_KEY *key) {
    FILE *fp = fopen(filename, "w");
    if (!fp) {
        fprintf(stderr, "无法打开文件 %s\n", filename);
        return 0;
    }
    // 打印公钥到文件
    sm2_key_print(fp, 0, 4, "SM2 Public Key", key);
    fclose(fp);
    return 1;
}

// 辅助函数：保存私钥到文件
int save_private_key_to_file(const char *filename, const SM2_KEY *key) {
    FILE *fp = fopen(filename, "w");
    if (!fp) {
        fprintf(stderr, "无法打开文件 %s\n", filename);
        return 0;
    }
    // 打印私钥到文件
    sm2_key_print(fp, 0, 4, "SM2 Private Key", key);
    fclose(fp);
    return 1;
}

int main() {  
    int ret = 0;  
    SM2_KEY key;  
    
    printf("生成 SM2 密钥对...\n");  
    ret = sm2_key_generate(&key);  
    if (ret != 1) {  
        fprintf(stderr, "SM2 密钥生成失败\n");  
        return EXIT_FAILURE;  
    }  
    printf("SM2 密钥生成成功。\n");  

    // 保存公钥到文件  
    printf("保存公钥到文件...\n");  
    ret = save_public_key_to_file("public_key.pem", &key);
    if (ret != 1) {
        fprintf(stderr, "保存公钥失败\n");
        return EXIT_FAILURE;
    }
    printf("公钥已保存到 public_key.pem\n");  

    // 保存私钥到文件  
    printf("保存私钥到文件...\n");  
    ret = save_private_key_to_file("private_key.pem", &key);
    if (ret != 1) {
        fprintf(stderr, "保存私钥失败\n");
        return EXIT_FAILURE;
    }
    printf("私钥已保存到 private_key.pem\n");  

    return EXIT_SUCCESS;  
}
